[CODE BLUE 2018] (多分楽しくて)実益のあるスマートコントラクトのハニーポット ベン・シュミット [レポート] #codeblue_jp
こんにちは、臼田です。
『世界トップクラスのセキュリティ専門家による日本発の情報セキュリティ国際会議』でありますCODE BLUE 2018に参加していますのでレポートします。
このブログは下記セッションについてのレポートです。
(多分楽しくて)実益のあるスマートコントラクトのハニーポット ベン・シュミット
イーサリアムコントラクトのハニーポットは、最古の詐欺と最新の技術を組み合わせている。結論からいうと、自らを詐欺師と思っている人達を騙すのはまだ簡単なことだということだ。これらの悪意のあるコントラクトには共通点がある。ほとんどの場合初心者が設計したように見せようとしていることだ。 そのためこれらのコントラクトは新しくこの分野に参入する者が陥るであろう複数の危険を学ぶ最適な場所となっており、スマートコントラクトセキュリティの実世界における興味深い(時に面白い)ケーススタディとして役立てることができる。 さほど脆弱でないコントラクトの興味深い例をいくつか調査することで、聴衆はスマートコントラクトセキュリティが実際にどのように機能するのか、そしてどのように詐欺師を撃退するのかについて深く理解することができる。
レポート
- 話すこと
- スマートコントラクトのハニーポットの話
- 脆弱性があるスマートコントラクトは実はそうでもないかも
- 話さないこと
- ハニーポットの探し方
- どのような詐欺があるか
- 金銭を盗む法律面の話
- イーサリアム/Solidity
- イーサリアムはアカウントごと管理されている
- 公開鍵を利用している
- エクスターナルアカウントとスマートコントラクトがある
- スマートコントラクトはコードを実行して資金分配などを行う
- 送金した情報や実行された内容がブロックチェーンに記録される
- 処理をしてもらうためには手数料としてetherを支払う
- すべてのコントラクトはEVM(Ethereum Virtual Machine)上で実行される
- gas(燃料)も必用
- Solidityがほとんどの方が使っている言語
- EVM上で動く静的型付け言語
- constructorを利用してデプロイされたときにinitする
- 関数はトランザクションと関連するデータを送れば実行できる
- Method IDを利用する
- 引数はintやstringなど
- コントラクトのソースが無いと引き数が何であったかは分かりづらい
- コントラクトが別のコントラクトを呼び出すことが可能
- 複雑なチェーンの処理が可能
- internal transactionsと呼ぶ
- 非常に分かりづらくなる
- 予想外のことが起こることもある
- トレースはできる
- コントラクトは状態を持っている
- ストレージに保存できる
- key-valueで256bit毎
- データを格納できるのはmemoryとstackも使えるが、ほぼストレージを利用する
- ストレージに保存できる
- 共通の落とし穴
- Solidityは開発中の言語なので仕方ない
- unhandled reentrant control flow
- 挙動が予想外になる
- 例としてDAOのハッキング
- 悪意のあるコントラクトを用意してコールインさせる
- etherを全額引き出された
- Delegatecall into vulnerable libraries
- 例はParity hack
- Delegatecallを脆弱な関数にする
- 同じコントラクトに見せかけてライブラリにアクセスさせる
- Unprotected critical functions
- 特定の関数は保護する必要がある
- owner onlyを入れたりする必要がある
- Improper handling of secrets
- ランダムは信頼できる値が必要
- シークレットが記録されていると適切なランダムにならない
- Tools for Ethereum Analysis
- etherscan.io
- 一番いいblockエクスプローラ
- ブロックをインデックス化して表示
- 直接コントラクトとインタラクトできる
- コンパイルもできる
- コントラクトのverifyもできる
- 他にもいろいろ
- etherscan.io
- スマートコントラクトのハニーポット
- HODLWallet
- これをデプロイしたら攻撃者に攻撃されたが、最終的には搾取されなかった
- the Private Bank
- テストネットにデプロイされていた
- テストネットでは攻撃が成功した
- メインネットでやろうとすると失敗した
- ログコントラクトと連携していたことが関係していた
- 実はそれが攻撃を阻止する手法だった
- 指定したコントラクトだけコンパイルしていないと受け付けないようになっていた
- free shitcoins
- etherが無いと引き出せない
- CryptoRoulette
- 適切な数字を当てるとETHをゲット
- secretをブロックチェーンから確認ができる場合もある
- 初期化していないポインタを利用している
- MultiplicatorX3
- コントラクトにある金銭より多く送れば全額もらえるように見える
- 実はthis.balanceは即座に更新されるので確実に巻き取れる
- コントラクトを実装しても、想定と違う動作になることはまだいっぱいある
- Solidityを良いものにしていかないといけない
感想
ハニーポットということで攻撃者の動向を探るものかと思いましたが、実際にetherを搾取するハニーポットが多くてびっくりしました。生々しいですねw
Solidityの発展には期待したいです。